package com.aaa.dang.modules.login.service.impl;

import com.aaa.dang.common.entity.Employee;
import com.aaa.dang.common.util.ResultModel;
import com.aaa.dang.modules.login.service.ILoginService;
import com.aaa.dang.modules.system.service.IEmployeeService;
import com.aaa.dang.modules.system.service.IPermissionService;
import com.aaa.dang.modules.system.service.IRoleService;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Set;

/**
 * 登录业务实现
 *
 * @author Dadazhao
 * @date 2018/12/21
 */
@Service
public class LoginServiceImpl implements ILoginService {
    /**
     * 注入员工业务层
     */
    @Autowired
    private IEmployeeService employeeService;
    /**
     * 注入权限业务层
     */
    @Autowired
    private IPermissionService permissionService;
    /**
     * 注入角色业务层
     */
    @Autowired
    private IRoleService roleService;
    /**
     * 注入返回结果集
     */
    @Autowired
    private ResultModel model;

    /**
     * 根据登录名获得员工信息
     *
     * @param username 登录账号
     * @return 员工的信息
     */
    @Override
    public Employee getEmployeeByName(String username) {
        return employeeService.getEmployeeByName(username);
    }

    /**
     * 获取菜单
     * @return 获得tree格式的菜单
     */
    @Override
    public ResultModel getMenu() {
        //从主体获得登录名
        String loginName = String.valueOf(SecurityUtils.getSubject().getPrincipal());
        //根据登录名获得员工信息
        Employee employee = employeeService.getEmployeeByName(loginName);
        //判断员工信息是否存在
        if (employee == null) {
            return null;
        }
        //判断员工是不是Admin
        if (employee.getIsAdmin() == 1) {
            //获得所有的菜单 空为所有
            return permissionService.getPermissionAll(null);
        } else {
            //通过员工id获得所有的拥有的所有权限
            return permissionService.getHavePermissionById(employee.getId());
        }
    }

    /**
     * 获得树形的菜单
     * @return 树形数据结构的数据
     */
    @Override
    public ResultModel getMenuTree() {
        //获得员工信息
        Employee employee = getLoginEmployeeInfo();
        //判断员工信息是否存在
        if (employee == null) {
            return null;
        }
        //判断员工是不是Admin
        if (employee.getIsAdmin() == 1) {
            //获得所有的菜单 空为所有 0为正常 1 为停用
            return permissionService.getPermissionTreeAll(null);
        } else {
            //通过员工id获得所有的拥有的所有权限
            return permissionService.getHavePermissionTreeById(employee.getId());
        }
    }

    /**
     * 获得登录员工的姓名
     *
     * @return 登录员工的姓名
     */
    @Override
    public String getEmployeeName() {
        //获得员工信息
        Employee employee = getLoginEmployeeInfo();
        if (employee == null) {
            return null;
        }
        return employee.getEmpName();
    }

    /**
     * 获得员工拥有的角色
     *
     * @param userName 登录账号
     * @return 账号拥有的所有角色
     */
    @Override
    public Set<String> getRolesByUserName(String userName) {
        return roleService.getRolesByEmpLoginName(userName);
    }

    /**
     * 通过登录用户名获得拥有的权限
     *
     * @param userName 登录账号
     * @return 账号拥有的所有权限
     */
    @Override
    public Set<String> getPermissionsByUserName(String userName) {
        //获得员工信息
        Employee employee = employeeService.getEmployeeByName(userName);
        //判断是否管理员
        if (1==employee.getIsAdmin()) {
            //所有的权限
            return  permissionService.getPermissionsByEmpLoginName(null);
        }else{
            //拥有的权限
            return  permissionService.getPermissionsByEmpLoginName(userName);
        }
    }

    /**
     * 修改员工信息
     * @param emp 员工实体
     * @return code 0 成功 1 失败
     */
    @Override
    public ResultModel updateEmployee(Employee emp) {
        return employeeService.updateEmployee(emp);
    }

    /**
     * 获得当前登录员工的信息
     * @return
     */
    @Override
    public Employee getLoginEmployeeInfo(){
        //从主体获得登录账号
        String loginName = String.valueOf(SecurityUtils.getSubject().getPrincipal());
        //获得员工信息
        Employee employee = employeeService.getEmployeeByName(loginName);
        return  employee;
    }

}
